home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3 (Developer)…68k, x86, SPARC, PA-RISC] / NeXTSTEP 3.3 Dev Intel.iso / NextDeveloper / Examples / AppKit / Backspace / BackView.m < prev    next >
Encoding:
Text File  |  1993-07-15  |  2.2 KB  |  105 lines

  1. //  BackView.m
  2. //
  3. //  a View that provides some functionality that some screen savers might
  4. //  find useful; you can subclass this class if you like.
  5. //
  6. //  You may freely copy, distribute, and reuse the code in this example.
  7. //  NeXT disclaims any warranty of any kind, expressed or  implied, as to its
  8. //  fitness for any particular use.
  9.  
  10. #import "BackView.h"
  11. #import "Thinker.h"
  12. #import <appkit/NXImage.h>
  13. #import <dpsclient/wraps.h>
  14. #import <libc.h>
  15.  
  16. @implementation BackView
  17.  
  18. - (BOOL) timePassed: (BStimeval) delay
  19. {
  20.     BStimeval now, msec;
  21.     BOOL result;
  22.     
  23.     now = currentTimeInMs();
  24.     if (BVthen == 0)        // added by shou-h@nexus.or.jp
  25.         BVthen = now;        // added by shou-h@nexus.or.jp
  26.     msec = now - BVthen;
  27.  
  28.     //so as not to suck too many cycles, if I'm waiting for some
  29.     // time more than a tenth of a second in the future, I sleep
  30.     // a while.  This interval is short enough that the app shouldn't
  31.     // seem unresponsive to user actions.
  32.     
  33.     // ok, so you'd never pull this trick if the user had to type.
  34.     // A better solution would be to coordinate the timed entry better,
  35.     // but I get slightly better performance from spinning in my
  36.     // timed entry (a bad idea for most apps...)
  37.     
  38.     if ((msec + 120) < delay)
  39.     {    usleep(110000);
  40.         return NO;
  41.     }
  42.     
  43.     result = (msec > delay);
  44.     if (result) BVthen = now;
  45.  
  46.     return result;
  47. }
  48.  
  49. - initFrame:(const NXRect *)frameRect
  50. {
  51.     [super initFrame:frameRect];
  52.     [self allocateGState];        // For faster lock/unlockFocus
  53.  
  54.     srandom(time(0));
  55.  
  56.     [self setImageConstraints];
  57.     return self;
  58. }
  59.  
  60. - sizeTo:(NXCoord)width :(NXCoord)height
  61. {
  62.     [super sizeTo:width :height];
  63.     [self setImageConstraints];
  64.     return self;
  65. }
  66.  
  67. - drawSelf:(const NXRect *)rects :(int)rectCount
  68. {
  69.     if (!rects || !rectCount) return self;
  70.  
  71.     PSsetgray(0);
  72.     NXRectFill(rects);
  73.  
  74.     return self;
  75. }
  76.  
  77. - setImageConstraints
  78. {
  79.     maxCoord.x = bounds.size.width - imageRect.size.width;
  80.     maxCoord.y = bounds.size.height - imageRect.size.height;
  81.     if (maxCoord.x < 0) maxCoord.x = 0;
  82.     if (maxCoord.y < 0) maxCoord.y = 0;
  83.  
  84.     return self;
  85. }
  86.  
  87.  
  88. - setImage: newImage
  89. {
  90.     image = newImage;
  91.     [image getSize: &imageRect.size];
  92.  
  93.     [self setImageConstraints];
  94.     [self display];
  95.  
  96.     return self;
  97. }
  98.  
  99. - (BOOL) useBufferedWindow
  100. {
  101.     return YES; // by default; can be overridden in subclasses
  102. }
  103.  
  104. @end
  105.